import FileSaver from 'file-saver';
import * as XLSX from 'xlsx';
import {
    Document,
    Packer,
    Paragraph,
    Table,
    TableCell,
    TableRow,
    AlignmentType,
    VerticalAlign,
    ImageRun,
    Media
} from "docx";
import html2canvas from 'html2canvas';

// arr = [{ el:dom, sheetName:'' }];  hideCols 指要省略的列
export function downloadExcel(arr, fileName, hideCols){
    try {
        const wb = XLSX.utils.book_new();
        arr.forEach((item, index)=>{
            const $e = item.el;
            let $table = $e.querySelector('.el-table__fixed')
            if(!$table) {
              $table = $e
            } 
            const ws = XLSX.utils.table_to_sheet($table, { raw:true });
            ws['!cols'] = [];
           
            let range = XLSX.utils.decode_range(ws['!ref']);
            let cWidth = [];
            for( let C = range.s.c; C <= range.e.c; ++C ) {
                let len = 60;      //默认列宽
                let len_max = 400;  // 最大列宽
                for( let R = range.s.r; R <= range.e.r; ++R ){
                    let cell = { c:C, r:R };  // 二维行列确定一个单元格
                    let cell_ref = XLSX.utils.encode_cell(cell);
                    if ( ws[cell_ref]){
                        let va = JSON.parse(JSON.stringify(ws[cell_ref].v));
                        // 匹配中文
                        var card1 = JSON.parse(JSON.stringify(va)).match(/[\u4e00-\u9fa5]/g); 
                        var card11 = '';
                        if ( card1 ){
                            card11 = card1.join("")
                        }
                        // 剔除中文
                        var card2 = JSON.parse(JSON.stringify(va)).match(/([^\u0000-\u00FF])/g, "")
                        let st = 0;
                        if ( card11 ) {
                            // 中文字节码长度
                            st += card11.length * 20
                        }
                        if ( card2 ) {
                            // 非中文字节码程度 
                            st += card2.length * 10
                        }
                        if ( st > len ) {
                            len = st;
                        }
                    }
                }
                if ( len > len_max ) {
                    len = len_max;
                }
                cWidth.push({ 'wpx':len })
            }
            ws['!cols'] = cWidth;
            if ( hideCols && hideCols.length ) {
                hideCols.forEach(key=>{
                    ws['!cols'][key] = { hidden:true }
                })
            }
            XLSX.utils.book_append_sheet(wb, ws, item.sheetName || 'Sheet' + ( index + 1 ));
        })
         const wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST:true, type: 'array'})
        console.log('wbout...', wbout);
        console.log('wb...', wb);  
        FileSaver.saveAs(
          new Blob([wbout],{type: 'application/octet-stream'}),
          `${fileName}.xlsx`,
        )
    } catch(e){
        console.log(e);
    }
}

async function renderElement(element, fileName) {
    let canvas = await html2canvas(element, {
        useCORS: true,                                                             // 允许跨域加载图片
        // scale: window.devicePixelRatio < 1.6 ? window.devicePixelRatio : 1.4,      // 根据设备像素比调整截图分辨率
        scale:2,
        allowTaint: true,                                                          // 允许渲染跨域图片到 Canvas（可能有安全隐患）
    }).catch(err=>{
        console.log(err);
    })
    return canvas.toDataURL('image/png');
}

export async function downloadWord(ele, fileName){
    // 使用了 docx 库来创建一个 Word 文档对象 (Document)，并在文档中添加了一些内容，包括文字、图片、表格。
    // 复制传入的dom
    let parentNode = ele.parentNode;
    let cloned = ele.cloneNode(true);
    cloned.style.padding = '0';
    cloned.style.borderRadius = '0'; 
    cloned.style.boxShadow = 'none';
    cloned.style.position = 'absolute';
    cloned.style.left = '-100%';
    document.body.appendChild(cloned);
    // console.log(cloned.offsetWidth, cloned.offsetHeight);

    let url = await renderElement(cloned);
    const doc = new Document({
        sections: [
            {
                children: [
                    // 第一段：添加描述内容，使用制表符（\t）做缩进
                    // new Paragraph({
                    //     text: "\t" + 'hello world',
                    // }),
 
                    // 第二段：空段落，用于分隔或增加空白
                    // new Paragraph({ text: '22222' }),
 
                    // 第三段：包含图片，设置图片居中
                    new Paragraph({
                        // alignment: AlignmentType.CENTER, // 设置图片居中
                        children: [
                            new ImageRun({
                                type: "png",
                                data:url,
                                transformation: {
                                    width:cloned.offsetWidth,     // 图片宽度设置为 400 像素
                                    height: cloned.offsetHeight,    // 图片高度设置为 240 像素
                                },
                            })
                        ],
                    })
 
                ],
            },
        ],
    });
    Packer.toBlob(doc).then((blob) => {
        // console.log('blob...', blob);
        const link = document.createElement("a");  // 创建一个链接元素 <a>，用于下载文件
        link.href = URL.createObjectURL(blob);     // 使用 URL.createObjectURL() 方法创建一个指向 Blob 对象的临时 URL
        link.download = `${fileName}.docx`;      // 设置下载文件的名称，使用 `reportName` 变量作为文件名
        link.click();                              // 模拟点击该链接，触发下载
        document.body.removeChild(cloned);
    });
}

